package com.zhaojk.audio.controller;

import com.zhaojk.audio.service.AudioService;
import com.zhaojk.audio.util.TimeTrace;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.IOException;

@RestController
@RequestMapping("/api/audio")
@Slf4j
public class AudioController {
    @Resource(name = "elevenAudioServiceImpl") // 根据名称注入
    private AudioService audioService;

    /**
     * 调用大模型生成语音数据，返回给页面。
     * 缺点是每次都生成数据，暂时不使用。
     * @param text
     * @return
     */
    @PostMapping("/speech")
    public ResponseEntity<byte[]> generateSpeech(@RequestParam String text) {
        byte[] audioData = audioService.generateAudioFromText(text);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("audio/mpeg"));
        headers.setContentDisposition(ContentDisposition.builder("attachment")
                .filename(text + ".mp3").build());

        return new ResponseEntity<>(audioData, headers, HttpStatus.OK);
    }

    /**
     * 获取text对应的mp3文件
     * 查找mp3文件： 1.不存在时，调用大模型生成语音数据，保存到mp3文件中，然后返回静态资源文件的url
     * 2.存在时，直接返回静态资源文件的url
     * @param text
     * @return

    @PostMapping("/url")
    public ResponseEntity<String> getUrl(@RequestParam String text) {
        try {
            // 确保目录存在
            Path directory = Paths.get(audioFilePath);
            if (!Files.exists(directory)) {
                Files.createDirectories(directory);
            }
            String filePath = audioFilePath + text + ".mp3";
            if(!Files.exists(Paths.get(filePath))){
                byte[] audioData = audioService.generateAudioFromText(text);
                FileUtils.writeByteArrayToFile(audioData, filePath);
                System.out.println("文件写入成功！");
            }

            // 假设Nginx配置的静态资源路径为 /audio/，对应的本地路径为 /Users/zhaojk/audio/
            // 则文件的访问URL为 http://your-domain.com/audio/ + 文件名
            // 根据Nginx配置调整
            String fileUrl = "/audio/" + text + ".mp3";
            return new ResponseEntity<>(fileUrl, HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseEntity<>("文件写入失败", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }*/

    /**
     * 获取text对应的语音数据
     * 查找语音文件： 1.不存在时，调用大模型生成语音数据，保存到mp3文件中，然后返回静态资源文件的url
     * 2.存在时，直接返回静态资源文件的url
     * @param text 文本
     * @param repeat 重复text文本的内容的次数，例如：apple,3 对应 apple apple apple 的语音
     * @return
     */
    @PostMapping("/base64")
    @TimeTrace("获取音频")
    public ResponseEntity<String> getDataBase64(@RequestParam String text, @RequestParam(required = false, defaultValue = "1") int repeat,
                                                @RequestParam(required = false, defaultValue = "true") boolean isRandom) {
        try {
            String base64Data = audioService.generateAudioBase64FromText(text, repeat, isRandom);
            log.info("getDataBase64结束");
            return new ResponseEntity<>(base64Data, HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseEntity<>("文件写入失败", HttpStatus.INTERNAL_SERVER_ERROR);
        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
